package net.xdlass.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author Rookie
 * @date 2025年-02月-18日- 19:40
 */
@Configuration
@EnableAsync
public class ThreadPoolTaskExecutorConfig {


    @Bean
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        /**
         * 配置并返回一个自定义的线程池任务执行器（ThreadPoolTaskExecutor）。
         * <p>
         * 该方法创建了一个具有特定配置的线程池，用于处理异步任务。主要配置包括核心线程数、最大线程数、队列容量、线程名称前缀以及拒绝策略。
         *
         * @return 配置好的线程池任务执行器实例
         */
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();

        // 设置线程池的核心线程数为4。核心线程数是指线程池中保持的最小线程数量，
        // 即使这些线程处于空闲状态也不会被销毁，除非设置了允许核心线程超时。
        threadPoolTaskExecutor.setCorePoolSize(4);

        // 设置线程池的任务队列容量为128。当核心线程数已满且队列未满时，新提交的任务将被放入此队列等待执行。
        // 队列容量决定了在创建新的工作线程之前可以容纳多少个待处理任务。
        threadPoolTaskExecutor.setQueueCapacity(128);

        // 设置线程池的最大线程数为8。当核心线程数和队列都已满时，线程池会创建新的工作线程来处理任务，
        // 直到达到最大线程数。超过最大线程数的任务将根据拒绝策略进行处理。
        threadPoolTaskExecutor.setMaxPoolSize(8);

        // 设置线程池中线程的存活时间为60秒
        // 当线程池中的线程数量超过核心线程数时，多余的空闲线程将会在存活时间结束后被终止
        threadPoolTaskExecutor.setKeepAliveSeconds(60);

        // 设置线程池中线程的名称前缀为“小付测试线程池”。这有助于在日志或调试信息中识别线程来源，
        // 方便问题排查和性能监控。
        threadPoolTaskExecutor.setThreadNamePrefix("小付测试线程池");

        // 设置线程池在拒绝执行新任务时的处理策略为AbortPolicy。当线程池无法处理新任务时，
        // AbortPolicy会抛出RejectedExecutionException异常，表示任务被拒绝。
        // 其他可选策略包括CallerRunsPolicy（由调用线程执行任务）、DiscardPolicy（直接丢弃任务）和DiscardOldestPolicy（丢弃队列中最老的任务）。
        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());

        // 返回配置好的线程池任务执行器实例
        return threadPoolTaskExecutor;

    }
}
